Ce site contient essentiellement des notes de travail. Le contenu est en constante évolution, et loin d'être achevé. (+ d'infos)
La plupart des documentations informatiques sont orientées Debian / Ubuntu.
Informatique/Softwares/LinuxCNC/Recettes/Relais sur un arduino
De Ordinoscope.net.
< Informatique | Softwares | LinuxCNC | Recettes
Sommaire[masquer] |
Introduction
L'idée est de contrôler au moins 2 relais depuis EMC2 via un Arduino, l'un pour activer l'alimentation de la machine, et l'autre pour la fraiseuse.
Ce n'est pas difficile de concevoir un tel circuit, mais ça demande quelques heures pour comprendre la HAL de EMC2. Cet exemple utilise le port USB/Sériel de l'Arduino, et envoie des commandes "10\n" (relais 1, off) ou "41\n" (relais 4, on).
Prérequis
sudo apt-get install python-serial
Configuration
LinuxCNC
/home/user/emc2/machine/custom.hal
... loadusr -Wn serial-relays ./serial-relays.py net spindle-on <= motion.spindle-on #net coolant-mist <= iocontrol.0.coolant-mist #net coolant-flood <= iocontrol.0.coolant-flood net xenable => serial-relays.relay1 net spindle-on => serial-relays.relay2 #net coolant-mist => serial-relays.relay3 #net coolant-flood => serial-relays.relay4
Remarques:
- "xenable" n'a pas besoin d'être défini
- Une fonction ne peut être définie que pour une seule action. EMC2 créera une erreur si une fonction est déjà attribuée ailleurs.
- EMC2 doit être redémarré pour prendre en considération les changements. Si le script en Python suivant n'existe pas ou qu'il contient des erreurs, EMC2 affichera une erreur et refusera de démarrer.
/home/user/emc2/machine/serial-relays.py
#!/usr/bin/python import hal, time, serial h = hal.component("serial-relays") h.newpin("relay1", hal.HAL_BIT, hal.HAL_IN) h.newpin("relay2", hal.HAL_BIT, hal.HAL_IN) h.newpin("relay3", hal.HAL_BIT, hal.HAL_IN) h.newpin("relay4", hal.HAL_BIT, hal.HAL_IN) h.ready() ser = serial.Serial('/dev/ttyUSB0', 115200, bytesize=8, parity='N', stopbits=1, timeout=0, xonxoff=0, rtscts=0) rA = 0 rB = 0 rC = 0 rD = 0 def serial_command(r, cmd): while ser.inWaiting(): pass ser.write(r) if True == cmd: ser.write('1') else: ser.write('0') ser.write ('\n') try: while 1: if (rA != h.relay1): rA = h.relay1 serial_command('1', rA) if (rB != h.relay2): rB = h.relay2 serial_command('2', rB) if (rC != h.relay3): rC = h.relay3 serial_command('3', rC) if (rD != h.relay4): rD = h.relay4 serial_command('4', rD) except KeyboardInterrupt: raise SystemExit
Arduino
/* Use an Arduino to drive relays from EMC2 HAL In this example, I'm using a 4-relays card with inverted input. If you drive directly the relays, redefine MYHIGH to HIGH and MYLOW to LOW. */ #define MYHIGH LOW #define MYLOW HIGH int relay_pin[] = {3, 4, 5, 6}; char in[2]; void setup () { int i = 0; while (relay_pin[i]) { digitalWrite (relay_pin[i], MYLOW); pinMode (relay_pin[i], OUTPUT); i++; } Serial.begin (115200); } void loop () { static int in_pos = 0; char c; int i; while (Serial.available ()) { char c = (char) Serial.read (); if (c == '\r' || c == '\n') { if (in_pos >= 2) { i = in[0] - 1; if (i >= 0 && i <= 3) { digitalWrite (relay_pin[i], (in[1] > 0) ? MYHIGH : MYLOW); } } in_pos = 0; } else { in[in_pos++] = c - 48; } } }